#include<bits/stdc++.h>

using namespace std;

struct cl{
    int l,r;
}zp[100005];

int n,m,l0,v0,t,la,ans,cnt;
int d[100005],v[100005],a[100005],p[100005];

bool cmp(cl c1,cl c2){
    if(c2.r<c1.r){
        return 0;
    }
    else if(c1.r==c2.r){
        if(c1.l<c2.l){
            return 1;
        }
        else{
            return 0;
        }
    }
    else{
        return 1;
    }
}

bool ck_u(int w,int x){
    double ct,pv;
    ct=v0-v[x];
    ct=ct/1.0/a[x];
    pv=(v[x]+v0)/2.0;
    if(ct*pv+d[x]<w){
        return 1;
    }
    else{
        return 0;
    }
}

bool ck_d(int w,int x){
    double ct,pv;
    ct=v0-v[x];
    ct=ct/1.0/a[x];
    pv=(v[x]+v0)/2.0;
    if(ct*pv+d[x]>w){
        return 1;
    }
    else{
        return 0;
    }
}

int ef_u(int x){
    int l=0,r=m+1,mid;
    while(l!=r-1){
        mid=(l+r)/2;
        if(ck_u(p[mid],x)){
            r=mid;
        }
        else{
            l=mid;
        }
    }
    return r;
}

int ef_d(int x){
    int l=0,r=m+1,mid;
    while(l!=r-1){
        mid=(l+r)/2;
        if(ck_d(p[mid],x)){
            l=mid;
        }
        else{
            r=mid;
        }
    }
    return l;
}

int ef_s(int x){
    int l=0,r=m+1,mid;
    while(l!=r-1){
        mid=(l+r)/2;
        if(p[mid]>=d[x]){
           r=mid;
        }
        else{
            l=mid;
        }
    }
    return r;
}

int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d%d",&n,&m,&l0,&v0);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&d[i],&v[i],&a[i]);
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&p[i]);
        }
        la=0;
        ans=m;
        cnt=0;
        for(int i=1;i<=n;i++){
            if(a[i]>0){
                zp[i].l=ef_u(i);
                zp[i].r=m;
                zp[i].l=max(zp[i].l,ef_s(i));
            }
            if(a[i]<0){
                zp[i].r=ef_d(i);
                zp[i].l=ef_s(i);
            }
            if(a[i]==0){
                if(v[i]>v0){
                    zp[i].l=ef_s(i);
                    zp[i].r=m;
                }
                else{
                    zp[i].l=0;
                    zp[i].r=0;
                }
            }
            if(zp[i].l>zp[i].r){
                zp[i].l=0;
                zp[i].r=0;
            }
        }
        sort(zp,zp+n+1,cmp);
        for(int i=1;i<=n;i++){
            if(zp[i].r!=0){
                cnt++;
            }
            if(la>=zp[i].l){
                continue;
            }
            else{
                la=zp[i].r;
                ans--;
            }
        }
        cout<<cnt<<" "<<ans<<endl;
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
